package 力扣._元辅音字符串计数1;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class 滑动窗口 {
    public int count(String word, int k) {
        Set<Character> vowels = new HashSet<>();
        vowels.add('a');vowels.add('i');vowels.add('e');vowels.add('o');vowels.add('u');

        int n = word.length();
        int ans = 0;
        // 滑动窗口，以每一个点为左端点，向右拓展，直至窗口内满足 元音全出现&&辅音数==k 的要求
        // 此时窗口右边的到有边界之间的都满足 原因全出现&& 辅音数>=k 的要求，将其数量加到ans中
        // 作为滑动窗口至少要满足，只增不减，才能是O(n)
        int j=0;
        Map<Character,Integer> set = new HashMap<>();
        int con = 0;
        for(int i=0;i<n;i++){
            while (j < n&& (con<k|| set.size()<5)) {
                if(vowels.contains(word.charAt(j))){
                    set.merge(word.charAt(j),1,Integer::sum);
                }else
                    con++;
                j++;
            }
            if(set.size()==5&&con>=k) {
                ans += n - j +1;
            }
            // 排除左边第一个
            char left = word.charAt(i);
            if(vowels.contains(left)){
                set.merge(left,-1,Integer::sum);
                if(set.get(left)==0)
                    set.remove(left);
            }else
                con --;
        }
        return ans;
    }
    public int countOfSubstrings(String word, int k){
        return count(word,k) - count(word,k+1);
    }

    public static void main(String[] args) {
        滑动窗口 solution = new 滑动窗口();
        int count = solution.countOfSubstrings("iqeaouqi", 2);
        System.out.println(count);
    }
}
